const path = require('path');
const webpack = require('webpack');
const fs = require('fs');

const modulesNeedOutput = require('./webpack.dll.modules');
if (modulesNeedOutput.length === 0) {
  throw { msg : '你需要在 webpack.dll.modules.js 文件指定哪些 module 要被打包' };
}

const modulesLoaded = [];
for (let index in modulesNeedOutput) {
  let modulePath = path.resolve(__dirname, 'scene', modulesNeedOutput[index], 'webpack.dll.js');
  if (!fs.existsSync(modulePath)) {
    continue;
  }
  console.log('加载 module : ' + modulePath);
  modulesLoaded.push(require(modulePath));
}

let raw = {
  mode : 'development', // development | production
  entry : {
    // wait for adding from 'modulesLoaded'
  },
  output : {
    filename : '[name].js',
    chunkFilename : '[name].chunk.js',
    path : path.resolve(__dirname, 'dist-comp'),
    // 这个 publicPath 如果不设置, 后面获取 chunk 会从 '${当前 js 目录}/${chunk 目录}' 获取, path 会乱
    // 比如在 http://localhost:8082/aurora/scene/mega_sphere/mega_sphere 环境下运行,
    // chunkFilename 比如是 aurora-res/mega_sphere/show/testChunk.chunk.js
    // 如果不设置 publicPath, 它会读成 :
    //   http://localhost:8082/aurora/scene/mega_sphere/mega_sphere/aurora-res/mega_sphere/show/testChunk.chunk.js
    // 那一定会 404
    publicPath : '/',
    library : 'chunk',
    libraryTarget : 'var' // 默认就是 var
  },
  plugins : [
    new webpack.DllPlugin({
      name : 'chunk', // 这个 name 要和上面的 library 相等
      path : path.resolve(__dirname, 'dist-comp', '[name]-manifest.json'),
      context : __dirname
    })
  ],
  externals : {
    vue : 'Vue'
  },
  module : {
    rules : [
      {
        test : /\.js$/,
        exclude : /node_modules/,
        use : [
          {
            loader : 'babel-loader',
            options : {
              presets : [
                '@babel/preset-env'/*, '@babel/preset-react'*/
              ],
              plugins : [
                '@babel/plugin-proposal-class-properties'
              ]
            }
          }
        ]
      }
    ]
  },
};

if (modulesLoaded.length) {
  for (let index in modulesLoaded) {
    const customer = modulesLoaded[index];
    Object.assign(raw.entry, customer.entry);
  }
}

if (Object.keys(raw.entry).length === 0) {
  throw {
    msg : `检查到你打包的文件入口为空. 你需要:
1. 确定要打包的 module, 写入文件 ./webpack.dll.modules.js, 文件内容可以是: 'module.exports=[\${MyModuleName}]'
2. 来到你 module 目录, 一般是 ./scene/\${MyModuleName}/ 下, 创建文件 'webpack.dll.js', 文件内容指定你的 js 入口文件, 例如:
    module.exports = {
      entry : {
        'aurora-res/\${MyModuleName}/\${path1}' : ['./scene/\${MyModuleName}/\${path2}']
      },
    }
   要注意, entry 的 key 和 value 的格式是固定的, 必须要 aurora-res 或者 scene 开头.
   path1 指向的是你 output 的位置, 也就是你在 aurora 服务器的 res/package/\${MyModuleName}/ 下存放的位置;
   path2 指向的是你入口 js 的位置.
   请保证 entry 至少有一项有效文件.
3. 重新进行打包. 命令是 npm run dll`
  };
}

module.exports = raw;
